package util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import entity.Emp;

/**
 * 
 * @author wick
 * @version 1.0
 */
public class WickXmlUtil {

	/**
	 * 将Docment写入Xml文件
	 * 
	 * @param file
	 *            传入一个File类型的参数
	 * @param doc
	 *            传入一个Docment类型的参数
	 * @return void 没有返回数据
	 * @throws IOException
	 *             可能会抛出了三种IO子类异常
	 */
	public static void writeXmlFile(File file, Document doc) throws IOException {
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");
		OutputStream os = new FileOutputStream(file);
		XMLWriter writer = new XMLWriter(os, format);
		writer.write(doc);
		writer.flush();
		writer.close();
		System.out.println("写入完毕！");
	}

	/**
	 * 将数据填入Docment中
	 * 
	 * @param empInfo
	 *            一个包含数据的实体类
	 * @return Document 返回的Docment中包含着实体类的数据
	 */
	public static Document getDocument(Emp empInfo) {
		Document doc = DocumentHelper.createDocument();

		Element root = doc.addElement("emps");

		Element emp = root.addElement("emp");
		emp.addAttribute("id", "1");

		Element name = emp.addElement("name");
		name.setText(empInfo.getName());

		Element age = emp.addElement("age");
//		age.setText(empInfo.getAge());

		Element address = emp.addElement("address");
		address.setText(empInfo.getAddress());

		return doc;

	}

	/**
	 * 读取指定的xml文件
	 * 
	 * @param file
	 *            指定的xml文件
	 * @return List<Emp> 不返回数据
	 * @throws DocumentException
	 *             可能因为对Docment类赋值失败
	 * 
	 */
	public static List<Emp> readerXmlFile(File file) throws DocumentException {
		SAXReader reader = new SAXReader();
		Document doc = reader.read(file);
		Element root = doc.getRootElement();
		List<Emp> emps = writeRoot(root);

		return emps;
	}
	/**
	 * 将root节点的内容封装到实体集合中
	 * @param node
	 * @return	List<Emp> 返回一个Emp集合
	 */
	private static List<Emp> writeRoot(Element node) {
		List<Emp> emps = new LinkedList<>();
		Emp emp = new Emp();
		@SuppressWarnings("unchecked")
		Iterator<Element> it = node.elementIterator();
		while (it.hasNext()) {
			Element ele = it.next();
			Element name = ele.element("name");
			Element age = ele.element("age");
			Element address = ele.element("address");
			emp.setName(name.getText());
//			emp.setAge(age.getText());
			emp.setAddress(address.getText());
			emps.add(emp);
		}

		return emps;
	}

	/**
	 * 将element节点中的内容递归读取，输出到控制台
	 * 
	 * @param node
	 *            这个节点中可能包含着其他节点，被递归读取
	 * @retutn void 不返回数据
	 */
	public static void listNode(Element node) {
		@SuppressWarnings("unchecked")
		List<Attribute> list = node.attributes();

		for (Attribute attr : list) {
			System.out.println(node.getName() + "的属性:" + attr.getName() + "=" + attr.getValue());
		}

		if (!(node.getTextTrim().equals(""))) {
			System.out.println(node.getName() + ":" + node.getText());
		}

		@SuppressWarnings("unchecked")
		Iterator<Element> it = node.elementIterator();
		while (it.hasNext()) {
			Element e = it.next();
			listNode(e);

		}
	}
	
	
	public static void printXML(Element elm,int indent){  
        //缩进字符串  
        String indentStr="    ";  
        //打印缩进  
        for(int i=0;i<indent;i++){  
            System.out.print(indentStr);  
        }  
        //得到该节点子节点的集合  
        List nodes=elm.elements();  
        //获得其所有属性  
        List attrs=elm.attributes();  
        StringBuffer attrStr=new StringBuffer("");  
        if(attrs.size()>0){  
            for (Iterator it = attrs.iterator(); it.hasNext();){  
                Attribute attr=(Attribute)it.next();  
                attrStr.append(" "+attr.getName()+"=\""+attr.getText()+"\"");  
            }  
        }  
        //如果有子节点则换行,没有子节点不换行  
        String enterStr=(nodes.size()<=0)?"":"\n";  
        //得到标签的内容  
        String elmStr=elm.getTextTrim();  
        //打印前标签  
        System.out.print("<"+elm.getName()+attrStr+">"+elmStr+enterStr);  
        //遍历子节点集合 并递归这个子节点  
        for (Iterator it = nodes.iterator(); it.hasNext();){  
            printXML((Element) it.next(),indent+1);  
        }  
        //如果有孩子节点 后标签不缩进  
        if(nodes.size()>0){  
            for(int i=0;i<indent;i++){  
                System.out.print(indentStr);  
            }  
        }  
        //打印后标签  
        System.out.println("</"+elm.getName()+">");  
    }  

}
